package com.kratos.designdemo.service;

import com.kratos.designdemo.controller.vo.OrderVo;

/**
 * @author kratos
 * @date 2022-06-09 13:53:49
 * <p>
 * 订单状态接口：
 * 除了support、update方法外，所有方法均对应一个业务类型，并默认做空实现(防止子类实现OrderStatusService时，实现多余无用的方法)。
 * tips：建议定义一个业务vo做统一的返回体，方便业务拓展，因为抽象类做校验时，如果不通过需抛出业务异常。
 */
public interface OrderStatusService {

    /**
     * 适配器支持接口
     * 子类实现的时候，可以选择vo传进来的订单状态，也可以从数据库查询出订单状态，根据业务场景做选择。
     * 本demo需要正常运行，所以选择传进来的订单状态。
     * 如果是数据库查询方式，可以在support时调用抽像类的方法(多个方法，参数校验、数据验证等公共方法)
     *
     * @param orderVo
     * @return
     */
    boolean support(OrderVo orderVo);

    /**
     * 对外统一接口
     *
     * @param orderVo
     */
    void update(OrderVo orderVo);

    /**
     * 待支付
     *
     * @param orderVo
     */
    default void waitPay(OrderVo orderVo) {
    }

    /**
     * 支付
     *
     * @param orderVo
     */
    default void paid(OrderVo orderVo) {
    }

    /**
     * 待收货
     *
     * @param orderVo
     */
    default void waitReceive(OrderVo orderVo) {
    }

    //.....................

    /**
     * 完成
     *
     * @param orderVo
     */
    default void completed(OrderVo orderVo) {
    }
}
